package com.gitee.ty850454.leetcode227;

/**
 * <p>给你一个字符串表达式 <code>s</code> ，请你实现一个基本计算器来计算并返回它的值。</p>
 * <p>整数除法仅保留整数部分。</p>
 * <p>示例 1：</p>
 * <pre><code>输入：s = &quot;3+2*2&quot;
 * 输出：7
 * </code></pre>
 * <p>示例 2：</p>
 * <pre><code>输入：s = &quot; 3/2 &quot;
 * 输出：1
 * </code></pre>
 * <p>示例 3：</p>
 * <pre><code>输入：s = &quot; 3+5 / 2 &quot;
 * 输出：5
 * </code></pre>
 * <p>提示：</p>
 * <ul>
 * <li><code>1 &lt;= s.length &lt;= 3 * 105</code></li>
 * <li><code>s</code> 由整数和算符 <code>(&#39;+&#39;, &#39;-&#39;, &#39;*&#39;, &#39;/&#39;)</code> 组成，中间由一些空格隔开</li>
 * <li><code>s</code> 表示一个 <strong>有效表达式</strong></li>
 * <li>表达式中的所有整数都是非负整数，且在范围 <code>[0, 231 - 1]</code> 内</li>
 * <li>题目数据保证答案是一个 <strong>32-bit 整数</strong></li>
 *
 * </ul>
 * <p>&nbsp;</p>
 *
 *
 * @author xy
 */
public class Leetcode227 {

    public static void main(String[] args) {
        Leetcode227 instance = new Leetcode227();
        System.out.println(instance.calculate("3+2*2"));
        System.out.println(instance.calculate(" 3/2"));
        System.out.println(instance.calculate(" 3+5 / 2 "));
        System.out.println(instance.calculate("2048"));
    }

    public int calculate(String s) {
        char[] chars = s.toCharArray();
        int length = chars.length;

        // 数组模拟栈
        int[] stack = new int[length];
        // 栈顶指针
        int top = -1;

        // 上一个符号
        char sign = '+';
        // 本次数字，如果是符号则为0
        int num = 0;

        for (int i = 0; i < length; i++) {
            char c = chars[i];

            // 如果是数字，则存起来，否则如果是空格同时之前没数字的话，跳过
            boolean isDigit = c <= '9' && c >= '0';
            if (isDigit) {
                num = num * 10 + c - '0';
            } else if (c == ' ' && num == 0) {
                continue;
            }

            // 如果是最后一个字符或者是符号，则根据上次的符号处理
            if (!isDigit || i == length - 1) {
                switch (sign) {
                    case '+':
                        stack[++top] = num;
                        break;
                    case '-':
                        stack[++top] = -num;
                        break;
                    case '*':
                        stack[top] *= num;
                        break;
                    case '/':
                        stack[top] /= num;
                        break;
                    default:
                }
                sign = c;
                num = 0;
            }
        }

        // 此时栈里只剩下一堆数字，全部加起来就是最终结果
        int result = 0;
        while (top >= 0) {
            result += stack[top--];
        }

        return result;
    }

}
